#!/usr/bin/env bash

set -e

arch=x86_64
kgdb=false
while getopts a:k OPT; do
  case "$OPT" in
    a)
      arch="$OPTARG"
      ;;
    k)
      kgdb=true
      ;;
  esac
done
shift "$(($OPTIND - 1))"
if [ "$#" -gt 0 ]; then
  brk="-ex 'break $1'"
else
  brk=''
fi

buildroot_out_dir="$(pwd)/buildroot/output.${arch}~"
gdb="${buildroot_out_dir}/host/usr/bin/${arch}-linux-gdb"
cd "${buildroot_out_dir}/build"/linux-custom/
if "$kgdb"; then
    cmd="$gdb \
      -q \
      -ex 'add-auto-load-safe-path $(pwd)' \
      -ex 'file vmlinux' \
      -ex 'target remote localhost:1234'
    "
else
  case "$arch" in
    'x86_64')
      # http://stackoverflow.com/questions/11408041/how-to-debug-the-linux-kernel-with-gdb-and-qemu/33203642#33203642
      # http://stackoverflow.com/questions/4943857/linux-kernel-live-debugging-how-its-done-and-what-tools-are-used/42316607#42316607
      # http://stackoverflow.com/questions/28607538/how-to-debug-linux-kernel-modules-with-qemu/44095831#44095831
      cmd="$gdb \
        -q \
        -ex 'add-auto-load-safe-path $(pwd)' \
        -ex 'file vmlinux' \
        -ex 'set arch i386:x86-64:intel' \
        -ex 'target remote localhost:1234' \
        $brk \
        -ex 'continue' \
        -ex 'disconnect' \
        -ex 'set arch i386:x86-64' \
        -ex 'target remote localhost:1234' \
        -ex 'lx-symbols ../kernel_module-1.0/'
      "
    ;;
    'arm'|'aarch64'|'mips64')
      cmd="$gdb \
        -q \
        -ex 'add-auto-load-safe-path $(pwd)' \
        -ex 'file vmlinux' \
        -ex 'target remote localhost:1234' \
        -ex 'lx-symbols ../kernel_module-1.0/' \
        $brk \
      "
    ;;
  esac
fi
echo "$cmd"
eval "$cmd"
